package com.gitee.deament.server.core.cli.db.list;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.DBData;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.List;

/**
 * LLEN key
 * 可用版本： >= 1.0.0
 * 时间复杂度： O(1)
 * 返回列表 key 的长度。
 *
 * 如果 key 不存在，则 key 被解释为一个空列表，返回 0 .
 *
 * 如果 key 不是列表类型，返回一个错误。
 *
 * 返回值
 * 列表 key 的长度。
 * @author deament
 */
@CliHander(command = "LLEN")
public class LLENcli extends AbstractCli {

    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {
        List<String> cliValues = getValues(command);
        if (cliValues.size() != 2) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'LLEN' command"));
            return;
        }
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        DBData dbData = SystemConfig.dbData;
        String key = cliValues.get(1);
        try {
            List<String> value = SystemConfig.dbData.getList(db, key).getValue();
            if (value == null) {
                channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("0"));
                return;
            }
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(""+value.size()));
        }catch (Exception e){
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(e.getMessage()));
            return;
        }
    }
}
